/* Copyright (C) 2010  Romolo Camplani, Marco Fortunato, Marco Marelli, Guido Rota, Fabio A. Schreiber et al.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

package org.dei.perla.sys.persistence;

import java.sql.SQLException;
import java.util.ArrayList;

import org.dei.perla.component.Startable;
import org.dei.perla.sys.core.PerlaConfigurationException;
import org.dei.perla.sys.query.llqruntime.datastructures.Buffer;
import org.dei.perla.sys.query.llqruntime.datastructures.OutOfBoundsBufferException;

/**
 * La seguente � una sottoclasse della classe DataPersitent e si occuppa di realizzare
 * la persistenza dei dati perseguendo una sorta di politica basata sul tempo, sfruttando
 * i metodi messi a disposizione della classe padre DataPersistent.
 * Sostanzialmente memorizza tutti dati presenti nel Buffer ogni volta che trascorre un 
 * certo tempo; il parametro temporale viene inizializzato con il costruttore della classe.
 * La politica � realizzata mediante l'utilizzo di una inner class che, crea un thread, nascosto a coloro
 * che utilizzano la classe, ma che possono gestire agevolmente sfruttando i metodi messi 
 * a disposizione dall'interfaccia Startable, opportunamente implementati.
 * @author Luigi Rinaldi & Matteo Rovero
 *
 */

public class DataPersistentTimePolitic extends DataPersistent{
	
	private Thread persistenceThread;
	private long timeInMillis;
	private boolean newTable = true;
	
	
	/**
	 * Richiama il costruttore della superclasse
	 * @param buff oggetto Buffer da cui prelevare i record.
	 * @param nameOfTable tabella MySql che conterr� i record del buff.
	 * @param timeInMillis tempo in millisecondi dopo cui eseguire lo svuotamento del buffer. Per 
	 * definizione non pu� essere negativo o nullo.
	 * @throws NotValidNameException eccezione sollevata nel caso in cui il nome della Tabella risulta 
	 * gi� utilizzato nel DB.
	 * @throws NullBufferException eccezione sollevata nel caso in cui il Buffer passato sia null.
	 * @throws OutOfBoundsException eccezione sollevata nel caso in cui il parametro timeInMillis
	 * sia negativo o nullo.
	 * @throws PerlaConfigurationException 
	 */
	public DataPersistentTimePolitic(Buffer buff, String nameOfTable, long timeInMillis) throws NullBufferException, NotValidNameException, OutOfBoundsException, PerlaConfigurationException{
		super(buff, nameOfTable);
		if(timeInMillis <= 0) throw new OutOfBoundsException();
	}
	
	

	@Override
	public ArrayList<String[]> inspect() {
		// TODO Auto-generated method stub
		String head[] = {"Table name", "Time before commit", "Source buffer id"};
		String fields[] = {this.nameTable, new Long(this.timeInMillis).toString(), this.buff.toString()};
		ArrayList<String[]> list = new ArrayList<String[]>();
		list.add(head);
		list.add(fields);
		return null;
	}


	@Override
	protected void loop() throws Exception {
		while(!persistenceThread.isInterrupted()){
			Thread.sleep(timeInMillis);
			if(!buff.getBuffer().isEmpty() && newTable ){
				try {
					createTable();
					newTable = false;
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				} catch (SQLException e1) {
					e1.printStackTrace();
				}
			}
			saveRecords(buff.getBuffer().size());

		}
	}

	@Override
	public void respawn() {
		// TODO Auto-generated method stub
		
	}
}
